package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import jdbc.ConnectionFactory;
import modelos.Contato;

public class ContatoDAO
{

    private Connection conexao;

    public ContatoDAO() throws SQLException
    {
        conexao = ConnectionFactory.getConexao();
    }

    /**
     * Método que adiciona um contato.
     *
     * @param contato Objeto de transferência com os dados do contato a ser
     * persistido.
     */
    public boolean adicionaContato(Contato contato) throws SQLException
    {
        boolean resultado = false;

        String sql = "INSERT INTO contato (nome, numero, operadora, email) values (?,?,?,?)";

        try (PreparedStatement stmt = conexao.prepareStatement(sql))
        {
            stmt.setString(1, contato.getNome());
            stmt.setString(2, contato.getNumero());
            stmt.setString(3, contato.getOperadora());
            stmt.setString(4, contato.getEmail());

            resultado = stmt.execute();
        }
        catch (SQLException e)
        {
            throw e;
        }

        return resultado;
    }

    /**
     * Método que retorna todos os contatos cadastrados.
     *
     * @return Uma lista com objetos de transferência contendo informações dos
     * contatos.
     */
    public ArrayList<Contato> getLista() throws SQLException
    {
        try
        {
            ArrayList<Contato> contatos = new ArrayList<>();

            String query = "SELECT * FROM contato ";

            try (PreparedStatement stmt = conexao.prepareStatement(query); ResultSet rs = stmt.executeQuery())
            {

                while (rs.next())
                {
                    Contato contato = new Contato();

                    contato.setCodigo(rs.getInt("codigo"));
                    contato.setNome(rs.getString("nome"));
                    contato.setNumero(rs.getString("numero"));
                    contato.setOperadora(rs.getString("operadora"));
                    contato.setEmail(rs.getString("email"));

                    contatos.add(contato);
                }
            }

            return contatos;
        }
        catch (SQLException e)
        {
            throw e;
        }
    }

    /**
     * Método que busca um contato dado o seu código.
     *
     * @param codigo O código do contato desejado.
     * @return Objeto de transferência com informações do contato.
     */
    public Contato buscarContato(int codigo) throws SQLException
    {
        Contato contato = null;

        String sql = "SELECT * FROM contato "
                + "WHERE codigo = " + codigo;

        try (PreparedStatement stmt = conexao.prepareStatement(sql); ResultSet rs = stmt.executeQuery())
        {

            while (rs.next())
            {
                contato = new Contato();

                contato.setCodigo(rs.getInt("codigo"));
                contato.setNome(rs.getString("nome"));
                contato.setNumero(rs.getString("numero"));
                contato.setNumero(rs.getString("operadora"));
                contato.setEmail(rs.getString("email"));
            }
        }
        catch (SQLException e)
        {
            throw e;
        }

        return contato;
    }

    /**
     * Método que exclui um contato dado o seu código.
     *
     * @param codigo O código do contato desejado.
     */
    public void excluirContato(int codigo) throws SQLException
    {

        String sql = "DELETE FROM contato "
                + "WHERE codigo = " + codigo;

        try (PreparedStatement stmt = conexao.prepareStatement(sql))
        {
            stmt.execute();
        }
        catch (SQLException e)
        {
            throw e;
        }
    }
}
